package person.bing.fbcloud.auth;

import lombok.Data;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Method;
import java.util.List;

/**
 * 刷题实践类
 * @author: mengfanbing
 * @date: 2020/5/12 11:36
 */
@Data
public class BrushQuestions {
    private static final String PATH = "d:/file/file.txt";

    public static void main(String[] args) throws Exception {

    }

    /**
     * 1 获取一个类的类对象的三种方式
     * 2 使用反射调用类的方法
     */
    public static void getClassObject() throws Exception {
        //1 获取一个类的类对象的三种方式
        // 第一种方式
//        Class<Post> postClass = Post.class;
        // 第二种方式
//        Class<? extends Post> postClass2 = post.getClass();
        // 第三种方式
        Class<?> postClass3 = Class.forName("person.bing.fbcloud.api.entity.Post");

        //2 使用反射调用类的方法
        Object param = "bing";
        Method declaredMethod = postClass3.getDeclaredMethod("getBing", String.class);
        System.out.println(declaredMethod.invoke(postClass3.newInstance(),param));
    }

    /**
     * 列出一个目录下所有的文件
     * @param list 用来存所有文件目录
     * @param path 要查询的目录
     */
    public static void getAllFile(List<String> list,String path){
        File file = new File(path);
        boolean exists = file.exists();
        if (exists){
            if (file.isFile()){
                list.add(file.getPath());
//                System.out.println(file.getPath());
            }else if (file.isDirectory()){
                File[] files = file.listFiles();
                for (File f:files){
                    getAllFile(list,f.getPath());
//                    System.out.println(f.getPath());
                }
            }
        }else{
            System.out.println("目录不存在");
        }
    }

    /**
     * 使用指定字符串进行分割，得到的String数组长度-1就是该字符串出现的次数
     * 有个问题：char[] chars = new char[1024 * 1024]。字符数组要设置多大
     * @param path 文件路径
     * @param word2 要统计的字符串
     * @throws Exception
     */
    public static void countWordInFileByBing(String path,String word2) throws Exception {
        //1char=2byte
        //1024char=2 * 1024byte
        //1024byte=1KB
        //1024KB=1MB
        char[] chars = new char[1024 * 1024];//这是2M吗
//        File file = new File("d:/file/file.txt");
//        FileReader fileReader = new FileReader(file);
        FileReader fileReader = new FileReader(path);
        fileReader.read(chars);
        String fileStr = new String(chars);
        String[] split = fileStr.split(word2);
        /*for (String str:split){
            System.out.println("======" + str + "======");
        }*/
//        System.out.println("split=" + split.length);
        if (split.length<=1){
            System.out.println("《" + word2 +"》" + "出现次数为" + 0);
        }else {
            int occourTime = split.length-1;
            System.out.println("《" + word2 +"》" + "出现次数为" + occourTime);
        }
    }

    /**
     * 统计给定文件中给定字符串的出现次数
     *(网上复制的，存在问题：如果字符串在文件中处于两行，会统计不到)
     * @param filename  文件名
     * @param word 字符串
     * @return 字符串在文件中出现的次数
     */
    public static int countWordInFile(String filename, String word) {
        int counter = 0;
        try (FileReader fr = new FileReader(filename)) {
            try (BufferedReader br = new BufferedReader(fr)) {
                String line = null;
                while ((line = br.readLine()) != null) {
                    int index = -1;
                    while (line.length() >= word.length() && (index = line.indexOf(word)) >= 0) {
                        counter++;
                        line = line.substring(index + word.length());
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return counter;
    }
}
